﻿#ifndef HARDWAREWIDGET_H
#define HARDWAREWIDGET_H

#include <QLineEdit>
#include <QWidget>
#include <QVector>
#include "connectingwindow.h"
#include "common/deviceattributes.h"
#include "model/datamanager.h"
#include "qstackedwidget.h"
#include "specificattrpaneladapter.h"
#include <QGroupBox>

class HardwareEditorPresenter;
class AttributePanelAdapter;
namespace Ui {
class HardwareWidget;
}

/**
 * @brief HardwareWidget
 * @details 硬件模板编辑主界面，负责展示连接图、属性面板与模板列表。
 */
class HardwareWidget : public QWidget
{
    Q_OBJECT
public:
    /**
     * @brief HardwareWidget::HardwareWidget
     * @details 构造硬件模板界面并初始化所有控件。
     * @param type 模板类型。
     * @param parent Qt 父对象。
     */
    explicit HardwareWidget(const HardwareTemplateType type, QWidget *parent = nullptr);
    /**
     * @brief HardwareWidget::~HardwareWidget
     * @details 释放界面资源。
     */
    ~HardwareWidget() override;

protected:
    /**
     * @brief HardwareWidget::eventFilter
     * @details 拦截事件以处理标签重命名等交互。
     * @param obj 目标对象。
     * @param event 发生的事件。
     * @return 是否消耗事件。
     */
    bool eventFilter(QObject *obj, QEvent *event) override;

private slots:
    /**
     * @brief HardwareWidget::on_pBtn_add_clicked
     * @details 处理新增模板请求，支持从当前模板复制。
     */
    void on_pBtn_add_clicked();
    /**
     * @brief HardwareWidget::on_pBtn_del_clicked
     * @details 删除当前选中的模板。
     */
    void on_pBtn_del_clicked();
    /**
     * @brief HardwareWidget::on_tabBarClicked
     * @details 响应双击标签，启用重命名编辑框。
     * @param index 标签索引。
     */
    void on_tabBarClicked(int index);
    /**
     * @brief HardwareWidget::on_setTabName
     * @details 提交标签重命名并同步组合框。
     */
    void on_setTabName();
    /**
     * @brief HardwareWidget::on_comboBox_htName_currentIndexChanged
     * @details 根据下拉框选择切换当前模板标签。
     * @param index 选中索引。
     */
    void on_comboBox_htName_currentIndexChanged(int index);
    /**
     * @brief HardwareWidget::on_tabWidget_ht_currentChanged
     * @details 切换当前模板时，重绑定属性视图并更新频率信息。
     * @param index 标签索引。
     */
    void on_tabWidget_ht_currentChanged(int index);
    /**
     * @brief HardwareWidget::on_pBtn_save_clicked
     * @details 保存当前模板内容并更新展示名称。
     */
    void on_pBtn_save_clicked();

private:
    /**
     * @brief HardwareWidget::loadAndDisplayAllTemplates
     * @details 从数据管理器载入所有模板并构建页面。
     */
    void loadAndDisplayAllTemplates();
    /**
     * @brief HardwareWidget::updateComboBoxName
     * @details 根据标签名称刷新名称下拉框。
     */
    void updateComboBoxName();
    /**
     * @brief HardwareWidget::initAttributeWidgets
     * @details 初始化右侧属性控件布局及内容。
     */
    void initAttributeWidgets();

private:
    Ui::HardwareWidget *ui = nullptr;
    HardwareTemplateType m_type;

    QLineEdit *m_tabNameEdit = nullptr;

    // 每个 tab 对应一个 Presenter
    QVector<HardwareEditorPresenter *> presenters_;
    AttributePanelAdapter *attrAdapter_ = nullptr;
    int activePresenterIndex_ = -1;
    QStackedWidget *m_attributeStackedWidget;
    SpecificAttrPanelAdapter *specificAdapter_;

    QGroupBox *m_SignalGeneratorWidget;
    QGroupBox *m_AmplifierWidget;
    QGroupBox *m_PowerMeterWidget;
    QGroupBox *m_AntennaWidget;
    QGroupBox *m_ConnectorWidget;
    QGroupBox *m_FieldProbeWidget;
    QGroupBox *m_ReceiverWidget;
    QGroupBox *m_CurrentProbeWidget;

    QLineEdit *m_SG_LevelMinEdit;
    QLineEdit *m_SG_LevelMaxEdit;
    QLineEdit *m_PA_InputLevelMaxEdit;
    QRadioButton *m_PA_CouplingConstantRadio;       //耦合常量选择
    QRadioButton *m_PA_CouplingTableRadio;          //耦合表选择
    QLineEdit *m_PA_CouplingConstEdit;              //耦合常量
    QComboBox *m_PA_FWDCouplingTableBox;            //正向耦合表
    QComboBox *m_PA_REVCouplingTableBox;            //反向耦合表
    QComboBox *m_PM_ChannelBox;                     //功率计通道
    QComboBox *m_Ant_HFactorsBox;                   //水平天线因子
    QComboBox *m_Ant_VFactorsBox;                   //垂直天线因子
    QLineEdit *m_Con_constValueEdit;                //连接器常量
    QComboBox *m_Con_tableBox;                      //连接器表格
    QRadioButton *m_Con_ConstantRadio;              //连接器常量选择
    QRadioButton *m_Con_TableRadio;                 //连接器表选择
    QComboBox *m_FP_CorrectionTableBox;             //场强探头xyz修正表
    QComboBox *m_CP_TransferCharacteristicTableBox; //电流注入探头传输属性
    QWidget *m_SwitchWidget;
    QComboBox *m_SwitchSelection, *m_SwitchChannel;
};

#include <QTabBar>
/**
 * @brief MyTabBar
 * @details 自定义 TabBar，根据文本宽度调整标签尺寸。
 */
class MyTabBar : public QTabBar
{
public:
    /**
     * @brief MyTabBar::tabSizeHint
     * @details 返回自适应文本宽度的标签尺寸。
     * @param index 标签索引。
     * @return 建议尺寸。
     */
    QSize tabSizeHint(int index) const override
    {
        const QString text = tabText(index);
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
        int w = fontMetrics().horizontalAdvance(text) + 80;
#else
        int w = fontMetrics().width(text) + 80;
#endif
        if (w < 80)
            w = 80;
        int h = QTabBar::tabSizeHint(index).height();
        return QSize(w, h);
    }
};

#include <QGroupBox>
#include <QStackedWidget>
#include <QTabWidget>
/**
 * @brief MyTabWidget
 * @details 使用自定义 MyTabBar 的 TabWidget。
 */
class MyTabWidget : public QTabWidget
{
    Q_OBJECT
public:
    /**
     * @brief MyTabWidget::MyTabWidget
     * @details 构造 TabWidget 并替换默认 TabBar。
     * @param parent Qt 父对象。
     */
    explicit MyTabWidget(QWidget *parent = nullptr)
        : QTabWidget(parent)
    {
        setTabBar(new MyTabBar());
    }
};

#endif // HARDWAREWIDGET_H
